﻿namespace AssetRipper.Yaml;

public abstract class YamlNode
{
	internal virtual void Emit(Emitter emitter)
	{
		bool isWrote = false;
		if (!CustomTag.IsEmpty)
		{
			emitter.Write(CustomTag.ToString()).WriteWhitespace();
			isWrote = true;
		}
		if (Anchor.Length > 0)
		{
			emitter.Write("&").Write(Anchor).WriteWhitespace();
			isWrote = true;
		}
		if (Stripped)
		{
			emitter.Write("stripped").WriteWhitespace();
			isWrote = true;
		}

		if (isWrote)
		{
			if (IsMultiline)
			{
				emitter.WriteLine();
			}
		}
	}

	public string EmitToString(bool formatKeys = false)
	{
		using StringWriter writer = new();
		Emitter emitter = new(writer, formatKeys);
		Emit(emitter);
		return writer.ToString();
	}

	public abstract YamlNodeType NodeType { get; }
	public abstract bool IsMultiline { get; }
	public abstract bool IsIndent { get; }

	public string Tag
	{
		get => CustomTag.Content;
		set => CustomTag = new YamlTag(YamlWriter.DefaultTagHandle, value);
	}
	public YamlTag CustomTag { get; set; }
	public string Anchor { get; set; } = string.Empty;
	public bool Stripped { get; set; }
}
